﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Net.Sockets;
using System.Net;
using System.Threading;

namespace Snake.Model
{
    class Connexion
    {
        private MainVue Player1;
        // Création d'une socket
        private Socket SendSocket;
        // Cible du multicast
        private EndPoint MulticastEndPoint;
        // Création d'une socket
        private Socket ListenSocket;

        //truc
        private Client Cl;
        private Serveur Serv;

        //Création d'un thread
        Thread ThreadEcouter;

        //private bool ConnexionOk = false;
        public Serveur serveur
        {
            get { return this.Serv; }
            set { this.Serv = value; }
        }

        public Client client
        {
            get { return this.Cl; }
            set { this.Cl = value; }
        } 

        public void Serveur()
        {

            Serv = new Serveur();
        }

        public void Client()
        {
            Cl = new Client();
        }


        public Connexion(string NomDuJoueur)
        {
            //Récupération information serveur.
           /* string s = Dns.GetHostName(); // obtenir le nom de son ordinateur
            //  Dns.
            IPHostEntry he = Dns.GetHostEntry(s);
            IPAddress[] tipa = he.AddressList;
            //addresse réseau local
            Console.Write("Addresse ip :" + tipa[3]);*/
            
            

            //On instancie un hôte
            Player1 = new MainVue();
            //On lui attribut son nom déjà saisi
            Player1.Nom = NomDuJoueur;

            //On va écouter pour voir si quelqu'un a déjà établi une connexion sur notre réseau
            ListenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            ListenSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
            // Liaison sur le port 50000
            ListenSocket.Bind(new IPEndPoint(IPAddress.Any, 50000));
            // Ask to receive from a specific Multicast IP Address
            ListenSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Parse("239.1.1.42")));

            //On va créer une socket pour communiquer
            SendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            MulticastEndPoint = new IPEndPoint(IPAddress.Parse("239.1.1.42"), 50000);

            SendSocket.SendTo(Encoding.UTF8.GetBytes(Player1.Nom), Player1.Nom.Length, SocketFlags.None, MulticastEndPoint);

            this.ThreadEcouter = new Thread(new ThreadStart(RecevoirNom));
            this.ThreadEcouter.Start();

        }

        public void EndConnexion()
        {
            //c'est mieux quand on lui dis d'arrété d'écouter mon loulou.
            //this.Serv.EndServ();
            this.SendSocket.Close();
            this.ListenSocket.Close();
            //on stop le thread.
            this.ThreadEcouter.Abort();
        }

        public void RecevoirNom()
        {
            Boolean ecouter=true;
            do
            {
                byte[] buffer = new byte[256];
                int recCount = 0;

                recCount = ListenSocket.Receive(buffer);
                Console.WriteLine(Encoding.UTF8.GetString(buffer, 0, recCount));
                Thread.Sleep(1000);
            } while (ecouter);

        }
    }
}
